{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ZH_nR-SvvkDG"
      },
      "source": [
        "#  Government Services Assistant - AI Chatbot"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "w8B741JgvpFj"
      },
      "source": [
        "This notebook demonstrates how to use an AI-powered assistant to answer questions about  government services and procedures, using the Firecrawl API and a friendly, step-by-step conversational approach."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "y8jiJYf4FA0m"
      },
      "source": [
        "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/DhivyaBharathy-web/PraisonAI/blob/main/examples/cookbooks/Chile_Government_Services_Assistant.ipynb)\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "RRw8sPG89KNb"
      },
      "source": [
        "# Install dependencies"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "rW8ltqCICV8o"
      },
      "outputs": [],
      "source": [
        "!pip install flask firecrawl praisonaiagents google-genai python-dotenv deep-translator"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XGjyt-B_EfbM"
      },
      "source": [
        "# Set API Keys"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "qf8B_YltDiIe"
      },
      "outputs": [],
      "source": [
        "import os\n",
        "\n",
        "os.environ['FIRECRAWL_API_KEY'] = \"your api key here\"\n",
        "os.environ['OPENAI_API_KEY'] = \"your api key here\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ccO0vwvCEqUJ"
      },
      "source": [
        "# Import Libraries & Translator"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "0prDQ5TpDnFu"
      },
      "outputs": [],
      "source": [
        "from firecrawl import FirecrawlApp, ScrapeOptions\n",
        "from deep_translator import GoogleTranslator\n",
        "import re\n",
        "\n",
        "def translate_to_spanish(text):\n",
        "    try:\n",
        "        return GoogleTranslator(source='auto', target='es').translate(text)\n",
        "    except Exception as e:\n",
        "        print(\"Translation to Spanish failed:\", e)\n",
        "        return text\n",
        "\n",
        "def translate_to_english(text):\n",
        "    try:\n",
        "        # Remove Markdown images and None values before translation\n",
        "        text = str(text).replace(\"None\", \"\")\n",
        "        text = re.sub(r'!\\[.*?\\]\\(.*?\\)', '', text)\n",
        "        return GoogleTranslator(source='auto', target='en').translate(text)\n",
        "    except Exception as e:\n",
        "        print(\"Translation to English failed:\", e)\n",
        "        return text"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WxOlCHMmEuK2"
      },
      "source": [
        "# Firecrawl Tool Class"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "G4RyzJ5mDp0t"
      },
      "outputs": [],
      "source": [
        "class FirecrawlTool:\n",
        "    def __init__(self, api_key, instruction: str, template: str):\n",
        "        if not api_key:\n",
        "            raise ValueError(\"Firecrawl API key not provided.\")\n",
        "        self.app = FirecrawlApp(api_key=api_key)\n",
        "        self.instruction = instruction\n",
        "        self.template = template\n",
        "\n",
        "    def search(self, search: str) -> str:\n",
        "        if not search or len(search) < 5:\n",
        "            return \"Error: Please provide a valid search query (at least 5 characters).\"\n",
        "        response_md = \"\"\n",
        "        try:\n",
        "            search_result = self.app.search(\n",
        "                query=self.instruction + search,\n",
        "                limit=2,\n",
        "                country=\"cl\",\n",
        "                lang=\"es\",  # Always search in Spanish for best results\n",
        "                scrape_options=ScrapeOptions(formats=[\"markdown\", \"links\"])\n",
        "            )\n",
        "            if search_result and hasattr(search_result, 'data') and search_result.data:\n",
        "                filtered_results = [\n",
        "                    result for result in search_result.data\n",
        "                    if str(result.get(\"url\", \"\")).startswith(\"https://www.chileatiende.gob.cl/fichas\") and not str(result.get(\"url\", \"\")).endswith(\"pdf\")\n",
        "                ]\n",
        "                if filtered_results:\n",
        "                    for num, result in enumerate(filtered_results, start=1):\n",
        "                        response_md += self.template.format(\n",
        "                            result_number=num,\n",
        "                            page_title=str(result.get(\"title\", \"\")),\n",
        "                            page_url=str(result.get(\"url\", \"\")),\n",
        "                            page_content=str(result.get(\"markdown\", \"\"))\n",
        "                        )\n",
        "                    return response_md\n",
        "                else:\n",
        "                    return None\n",
        "            else:\n",
        "                return None\n",
        "        except Exception as e:\n",
        "            return f\"Error during search: {e}\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MjkjTWn_ExS0"
      },
      "source": [
        "# Firecrawl Prompt Template"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "AfivymU8Dufz"
      },
      "outputs": [],
      "source": [
        "FIRECRAWL_INSTRUCTION = \"ChileAtiende: \"\n",
        "FIRECRAWL_TEMPLATE = \"\"\"\n",
        "# Result {result_number}\n",
        "\n",
        "## Page Name:\n",
        "\"{page_title}\"\n",
        "\n",
        "## URL:\n",
        "{page_url}\n",
        "\n",
        "## Content:\n",
        "{page_content}\n",
        "\n",
        "\"\"\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "zK8AA_DlEz9K"
      },
      "source": [
        "# Initialize Firecrawl Tool"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "c3NKK0ZjDwKT"
      },
      "outputs": [],
      "source": [
        "firecrawl_tool = FirecrawlTool(\n",
        "    api_key=os.environ['FIRECRAWL_API_KEY'],\n",
        "    instruction=FIRECRAWL_INSTRUCTION,\n",
        "    template=FIRECRAWL_TEMPLATE\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uzXYIF_gE3XV"
      },
      "source": [
        "# Main Chat Loop"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "TXMgZQNkDx7n",
        "outputId": "76303cd1-a576-483f-a22d-9857e5e6d797"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Hello! I am your ChileAtiende assistant, Tomás. How can I help you today?\n",
            "You can ask me, for example: How to renew your ID card, How to apply for the Winter Bonus, etc.\n",
            "\n",
            "You: exit\n",
            "Tomás: It was a pleasure to help you. Goodbye!\n"
          ]
        }
      ],
      "source": [
        "print(\"Hello! I am your ChileAtiende assistant, Tomás. How can I help you today?\")\n",
        "print(\"You can ask me, for example: How to renew your ID card, How to apply for the Winter Bonus, etc.\")\n",
        "\n",
        "while True:\n",
        "    user_input = input(\"\\nYou: \")\n",
        "    if user_input.lower() in [\"exit\", \"quit\"]:\n",
        "        print(\"Tomás: It was a pleasure to help you. Goodbye!\")\n",
        "        break\n",
        "\n",
        "    # Translate English input to Spanish for Firecrawl\n",
        "    spanish_query = translate_to_spanish(user_input)\n",
        "    spanish_answer = firecrawl_tool.search(spanish_query)\n",
        "\n",
        "    # Only translate if we got a real answer\n",
        "    if spanish_answer and isinstance(spanish_answer, str) and spanish_answer.strip() and \"Error\" not in spanish_answer:\n",
        "        try:\n",
        "            english_answer = translate_to_english(spanish_answer)\n",
        "            print(\"\\nTomás (in English):\\n\", english_answer)\n",
        "        except Exception as e:\n",
        "            print(f\"\\nTomás: I found information, but couldn't translate it. Here it is in Spanish:\\n{spanish_answer}\\n(Translation error: {e})\")\n",
        "    else:\n",
        "        print(\"\\nTomás: Sorry, I couldn't find relevant information. Try rephrasing your question or ask about another service.\")"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
